/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ASAInst;

import exception.DivisionByZeroException;
import exception.VariableNonDeclareeException;
import generation.GestionVariables;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author FM & KB
 */
public class ASAInstBloc extends ASAInst {

    List<ASAInst> listeInstructions;
    int instructionActuelle;
    String nomFonction;
    boolean blocRacine = false;

    public ASAInstBloc() {
        listeInstructions = new ArrayList<ASAInst>();
    }
    
    public void setBlocRacine(){
        this.blocRacine = true;
    }

    public void setNomFonction(String nomFonction) {
        this.nomFonction = nomFonction;
    }

    @Override
    public void executer() throws VariableNonDeclareeException, DivisionByZeroException{
        if (!blocRacine) {
            GestionVariables.ajouterNiveau(nomFonction);
        }
        for (int i = instructionActuelle; i < listeInstructions.size(); i++) {
            listeInstructions.get(i).executer();
        }
        if (!blocRacine) {
            GestionVariables.retirerNiveau(nomFonction);
        }
    }

    /**
     * Execute l'instruction et renvoit true à la dernière instruction exécutée 
     * sinon renvoit false
     * @return 
     */
    public boolean executerInstruction() throws VariableNonDeclareeException, DivisionByZeroException {
        listeInstructions.get(instructionActuelle).executer();
        instructionActuelle++;
        if (instructionActuelle == listeInstructions.size()) {
            instructionActuelle = 0;
            System.out.println("\nFin du programme\n");
            return true;
        }
        return false;
    }

    public void ajouterInstruction(ASAInst instruction) {
        listeInstructions.add(instruction);
    }

    @Override
    public String notationExplorateur(String prefixe) {
        String res = prefixe + getLabelExplorateur() + "\n";
        String prefixeSuiv = prefixe + "   ";
        for (ASAInst instruction : listeInstructions) {
            res += instruction.notationExplorateur(prefixeSuiv);
        }
        return res;
    }

    public int getInstructionActuelle() {
        return this.instructionActuelle;
    }

    public void setInstructionActuelle(int indice) {
        this.instructionActuelle = indice;
    }

    @Override
    public String getLabelExplorateur() {
        return "BLOC";
    }

    @Override
    public ASAInst simplifie() throws VariableNonDeclareeException, DivisionByZeroException{
        ASAInstBloc instBlocSimpl = new ASAInstBloc();
        for (ASAInst instruction : listeInstructions) {
            ASAInst instruction_simpl = instruction.simplifie();
            instBlocSimpl.ajouterInstruction(instruction_simpl);
        }
        return instBlocSimpl;
    }
}
